package com.bjfu.demo.task;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import com.bjfu.demo.entity.RpData;
import com.bjfu.demo.service.RpDataService;
import com.bjfu.demo.until.JsonUtils;
import com.bjfu.demo.until.TimeUtils;

/**
 * @create 2019-12-29 14:39
 * 定时任务
 */
@Component
public class Timedtask {

    //存在redis中上次的操作时间的key
    private final String redis_lasttime = "releaseplatfromlasttime";

    //数据库库的前缀
    private final String prefix = "rp";

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;


    @Autowired
    private RpDataService rpDataService;

    //http://59.202.52.147:8080/zjqxkqfb/areainfo/evahour?begintime=2019-11-22 20&endtime=2019-11-22 20&sitetype=3&type=1
    private final String url_start = "http://59.202.52.147:8080/zjqxkqfb/areainfo/evahour?begintime=";
    private final String url_middle = "&endtime=";
    private final String url_end = "&sitetype=3&type=1";


    @Scheduled(cron = "0 55 * * * ?")//每小时的55分钟
    public void insertRpData2() {

        //获取当前时间
        Date currentDate = new Date();
        //格式化当前时间YMDH
        String stringCurrentDate = TimeUtils.dateFormatWithPatternYYYYMMDDHH(currentDate);


        //在redis获取上次的时间
        String strLastTime = stringRedisTemplate.opsForValue().get(redis_lasttime);//"2020-01-09 19"
        //去除两边的引号
        strLastTime = strLastTime.substring(1, strLastTime.length() - 1);//2020-01-09 19

        //保存上次时间到currentDate中所有的时间段的集合
        List<String> dataList = new ArrayList<>();

        //时间段临时变量
        String tempDate = strLastTime;
        //获取到上次时间到currentDate中所有的时间段
        do {
            dataList.add(tempDate);
            //获取下一个小时
            Date date = TimeUtils.dateFormatWithPatternYYYYMMDDHH(tempDate);
            Date nextHourDay = TimeUtils.getNextHourDay(date, 1);
            tempDate = TimeUtils.dateFormatWithPatternYYYYMMDDHH(nextHourDay);
        } while (!stringCurrentDate.equals(tempDate));
        dataList.add(stringCurrentDate);//添加当前时间点

        //分段发送请求
        for (String s : dataList) {
            //拼接请求字符串
            String url = url_start + s + url_middle + s + url_end;
            //获取请求数据
            String rpdatas = restTemplate.getForObject(url, String.class);
            if (rpdatas == null || "[]".equals(rpdatas)) {
                System.out.println("--------------->"+s+"----------空");
                continue;
            }
            System.out.println("--------------->"+s+"-----------不空");
            //修改上次读的时间
            strLastTime = s;

            //把大写字母变为小写字母(来的数据都是大写，数据库都是小写)
            String rpdatasLowerCase = rpdatas.toLowerCase();
            //插入redis中数据,并且设置过期时间12个小时
            System.out.println("插入redis中数据------------>");
            stringRedisTemplate.opsForValue().set(prefix + ":" + s + "-" + s,
                    rpdatasLowerCase,
                    12, TimeUnit.HOURS);

            //解析为对象
            List<RpData> rpDatas = JsonUtils.jsonToList(rpdatasLowerCase, RpData.class);

            //保存数据库
            System.out.println("---------------S-T-A-R-T----------------");
            //System.out.println(rpdatas);
            //rpDatas.stream().forEach(System.out::println);
            rpDataService.insertRpdatas(rpDatas);
            System.out.println("-----------------E-N-D------------------");
        }


        //获取strLastTime下一个小时，下次就在此处开始取值
        Date lastTime = TimeUtils.dateFormatWithPatternYYYYMMDDHH(strLastTime);
        Date nextHourDay = TimeUtils.getNextHourDay(lastTime, 1);
        //在两边加双引号，存到redis中
        strLastTime = "\"" + TimeUtils.dateFormatWithPatternYYYYMMDDHH(nextHourDay) + "\"";
        //更新redis中的数据
        System.out.println("更新redis中时间------------>");
        stringRedisTemplate.opsForValue().set(redis_lasttime, strLastTime);


    }


    //@Scheduled(cron = "0 0/1 * * * ? ")//一分钟一次
    //@Scheduled(cron = "0/1 * * * * ? ")//每秒
    //@Scheduled(cron = "0 55 * * * ?")//每小时的55分钟
//    public void insertRpData() {
//
//        //获取当前时间
//        Date currentDate = new Date();
//
//        //在redis获取上次的时间
//        String strLastTime = stringRedisTemplate.opsForValue().get(redis_lasttime);//"2020-01-09 19"
//       //去除两边的引号
//        strLastTime = strLastTime.substring(1, strLastTime.length() - 1);//2020-01-09 19
//
//        //拼接请求字符串
//        String url = url_start
//                + strLastTime
//                + url_middle
//                + TimeUtils.dateFormatWithPatternYYYYMMDDHH(currentDate)
//                + url_end;
//
//
//        //获取请求数据
//        String rpdatas = restTemplate.getForObject(url, String.class);
//
//
//        //把大写字母变为小写字母(来的数据都是大写，数据库都是小写)
//        String rpdatasLowerCase = rpdatas.toLowerCase();
//
//        //插入redis中数据
//        System.out.println("插入redis中数据------------>");
//        stringRedisTemplate.opsForValue().set(prefix+":"+strLastTime+"-"+TimeUtils.dateFormatWithPatternYYYYMMDDHH(currentDate), rpdatasLowerCase);
//
//
//        //解析为对象
//        List<RpData> rpDatas = JsonUtils.jsonToList(rpdatasLowerCase, RpData.class);
//
//        //保存数据库
//        System.out.println("---------------S-T-A-R-T----------------");
//        System.out.println(rpdatas);
//        //rpDatas.stream().forEach(System.out::println);
//        rpDataService.insertRpdatas(rpDatas);
//        System.out.println("-----------------E-N-D------------------");
//
//
//
//
//        //获取当前小时的下一个小时，下次就在此处开始取值
//        Date lastTime = TimeUtils.getNextHourDay(currentDate, 1);
//        //在两边加双引号，存到redis中
//        strLastTime = "\"" + TimeUtils.dateFormatWithPatternYYYYMMDDHH(lastTime) + "\"";
//        //更新redis中的数据
//        System.out.println("更新redis中时间------------>");
//        stringRedisTemplate.opsForValue().set(redis_lasttime, strLastTime);
//
//
//    }


}
